import logging
from logging.handlers import RotatingFileHandler
import os
import tkinter as tk  # 补充缺少的导入
from config import Config
import time


def init_loggers():
    """初始化两个日志器：分别用于PDF签字页插入和内部签字页提取""" 
    # 确保日志文件夹存在
    log_dir = Config.LOG_DIR
    os.makedirs(log_dir, exist_ok=True)
    
    # 获取绝对路径，避免相对路径解析问题
    log_file_organize = os.path.abspath(os.path.join(log_dir, Config.LOG_FILE_ORGANIZE_NAME))
    log_file_extract = os.path.abspath(os.path.join(log_dir, Config.LOG_FILE_EXTRACT_NAME))
    
    # 强制删除旧的日志文件（Windows系统下特别重要）
    for log_file in [log_file_organize, log_file_extract]:
        if os.path.exists(log_file):
            try:
                # 尝试直接删除文件
                os.remove(log_file)
            except PermissionError:
                # 如果文件被锁定，等待一小段时间后重试
                time.sleep(0.1)
                try:
                    os.remove(log_file)
                except:
                    # 如果仍无法删除，至少记录警告信息
                    print(f"警告: 无法删除日志文件 {log_file}，可能被其他进程占用")
    
    # ------------------------------
    # 1. 定义PDF处理相关的日志器
    # ------------------------------
    pdf_logger = logging.getLogger("pdf_organizer")
    # 日志级别：只记录INFO及以上
    pdf_logger.setLevel(logging.INFO)
    # 防止日志重复输出到父日志器
    pdf_logger.propagate = False
    
    # 先移除所有旧的处理器
    for handler in pdf_logger.handlers[:]:
        pdf_logger.removeHandler(handler)
        handler.close()
    
    # 输出到文件（按大小切割，最多保留5个备份）
    pdf_handler = RotatingFileHandler(
        log_file_organize,
        mode='w',  # 保持每次运行覆盖文件
        maxBytes=1024*1024*5,  # 5MB，达到此大小会自动切割
        backupCount=5,  # 最多保留5个备份文件
        encoding="utf-8"
    )
    
    # 日志格式：时间 - 日志器名称 - 级别 - 消息
    pdf_formatter = logging.Formatter(
        "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    )
    pdf_handler.setFormatter(pdf_formatter)
    
    # 添加处理器到日志器
    pdf_logger.addHandler(pdf_handler)
    

    # ------------------------------
    # 2. 定义内部签字页提取的日志器
    # ------------------------------
    extract_logger = logging.getLogger("pdf_extract")
    extract_logger.setLevel(logging.INFO)
    # 防止日志重复输出
    extract_logger.propagate = False
    
    # 先移除所有旧的处理器
    for handler in extract_logger.handlers[:]:
        extract_logger.removeHandler(handler)
        handler.close()
    
    # 输出到另一个文件
    extract_handler = RotatingFileHandler(
        log_file_extract,
        mode='w',  # 保持每次运行覆盖文件
        maxBytes=1024*1024*5,  # 5MB
        backupCount=5,  # 最多保留5个备份
        encoding="utf-8"
    )
    
    # 可以用不同的格式（例如包含模块名）
    extract_formatter = logging.Formatter(
        "%(asctime)s - %(name)s - %(module)s - %(levelname)s - %(message)s"
    )
    extract_handler.setFormatter(extract_formatter)
    
    extract_logger.addHandler(extract_handler)
    
    return pdf_logger, extract_logger

# 程序启动时初始化日志器（全局只需要执行一次）
pdf_logger, extract_logger = init_loggers()


def create_gui_handler(text_widget):
    """创建GUI日志处理器的工具函数"""
    class GUILogHandler(logging.Handler):
        def __init__(self, text_widget):
            super().__init__()
            self.text_widget = text_widget
            self.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

        def emit(self, record):
            try:
                log_msg = self.format(record) + "\n"
                # 写入日志区（需临时解除只读）
                self.text_widget.config(state=tk.NORMAL)
                self.text_widget.insert(tk.END, log_msg)
                self.text_widget.see(tk.END) 
                self.text_widget.config(state=tk.DISABLED)
            except Exception:
                self.handleError(record)
    
    return GUILogHandler(text_widget)